module route.router;

// import std.functional : toDelegate;
import vibe.vibe;

import controller.TeleplayController;
import controller.MovieController;
import controller.AnimationController;
import controller.AnnualReviewController;
import controller.TeleplayVlinkController;
import controller.MovieVlinkController;
import controller.AnimationVlinkController;
import controller.PlaylinkController;
import controller.LoginController;
import controller.CollectController;
import controller.SearchController;
import utils.MyJwt : jwtValidator;
import utils.SecurityVerification : timeStampValidator;

/** 
 * 初始化路由、绑定处理函数、监听端口
 */
void initRouter ()
{
    auto settings = new HTTPServerSettings;
    settings.port = 7879;
    settings.bindAddresses = ["127.0.0.1"];
    settings.errorPageHandler = toDelegate(&errorPage);

    // router路由初始化
    auto router = new URLRouter();
    // 静态文件路由
    router.get("*", serveStaticFiles("./public/"));
    // 登录
    router.post("/api/login", &uearLogin);
    // 退出登录
    router.delete_("/api/logout", &userLogout);

    // 时间戳验证
    router.any("*", &timeStampValidator);

    // api路由----------------------------------------------------
    // 获取全部电视剧（年份分组）
    router.get("/api/teleplay/all", &getAllTeleplayList);
    // 获取全部电视剧
    router.get("/api/teleplay/listall", &getAllTeleplay);
    // 分页获取电视剧数据
    router.get("/api/teleplay", &getTeleplayListPaging);
    // 获取电视剧全部年份
    router.get("/api/teleplay/years", &getTeleplayYears);
    // 获取单个电视剧的播放连接列表
    router.get("/api/teleplay/vlist", &getTeleplayVlinks);
    // 获取单个电视剧
    router.get("/api/teleplay/:id", &getOneTeleplay);

    // 获取全部电影（年份分组）
    router.get("/api/movie/all", &getAllMovieList);
    // 获取全部电影
    router.get("/api/movie/listall", &getAllMovie);
    // 分页获取电影数据
    router.get("/api/movie", &getMovieListPaging);
    // 获取电影全部年份
    router.get("/api/movie/years", &getMovieYears);
    // 获取单个电影的播放连接列表
    router.get("/api/movie/vlist", &getMovieVlinks);
    // 获取单个电影
    router.get("/api/movie/:id", &getOneMovie);

    // 获取全部动漫（年份分组）
    router.get("/api/animation/all", &getAllAnimationList);
    // 获取全部动漫
    router.get("/api/animation/listall", &getAllAnimation);
    // 分页获取动漫数据
    router.get("/api/animation", &getAnimationListPaging);
    // 获取动漫全部年份
    router.get("/api/animation/years", &getAnimationYears);
    // 获取单个动漫的播放连接列表
    router.get("/api/animation/vlist", &getAnimationVlinks);
    // 获取单个动漫
    router.get("/api/animation/:id", &getOneAnimation);

    // 获取全部年度点评列表数据
    router.get("/api/annualreview/all", &getAllAnnualReviewList);
    // 获取年度点评列表数据
    router.get("/api/annualreview", &getAnnualReviewList);

    // 视频播放地址解析
    router.post("/api/playlink", &parsePlaylink);

    // 首页搜索
    router.get("/api/search", &search);
    // api路由end-------------------------------------------------

    // admin路由，需校验token---------------------------------------------
    // token校验，此后面的路由认证后才能访问
    router.any("*", &jwtValidator);
    // 添加电视剧
    router.post("/admin/teleplay/add", &addTeleplay);
    // 编辑电视剧
    router.put("/admin/teleplay/edit/:id", &editTeleplay);
    // 删除一个电视剧
    router.delete_("/admin/teleplay/:id", &deleteTeleplay);
    // 写电视剧评语
    router.post("/admin/teleplay/comment/:id", &doTeleplayComment);
    // 添加电视剧视频链接
    router.post("/admin/tlink/add", &addTeleplayLink);
    // 编辑电视剧视频链接
    router.put("/admin/tlink/:id", &editTeleplayLink);
    // 删除一个电视剧视频链接
    router.delete_("/admin/tlink/:id", &removeTeleplayLink);

    // 添加电影
    router.post("/admin/movie/add", &addMovie);
    // 编辑电影
    router.put("/admin/movie/edit/:id", &editMovie);
    // 删除一个电影
    router.delete_("/admin/movie/:id", &deleteMovie);
    // 写电影评语
    router.post("/admin/movie/comment/:id", &doMovieComment);
    // 添加电影视频链接
    router.post("/admin/mlink/add", &addMovieLink);
    // 编辑电影视频链接
    router.put("/admin/mlink/:id", &editMovieLink);
    // 删除一个电影视频链接
    router.delete_("/admin/mlink/:id", &removeMovieLink);

    // 添加动漫
    router.post("/admin/animation/add", &addAnimation);
    // 编辑动漫
    router.put("/admin/animation/edit/:id", &editAnimation);
    // 删除一个动漫
    router.delete_("/admin/animation/:id", &deleteAnimation);
    // 写动漫评语
    router.post("/admin/animation/comment/:id", &doAnimationComment);
    // 添加动漫视频链接
    router.post("/admin/alink/add", &addAnimationLink);
    // 编辑动漫视频链接
    router.put("/admin/alink/:id", &editAnimationLink);
    // 删除一个动漫视频链接
    router.delete_("/admin/alink/:id", &removeAnimationLink);

    // 添加年度点评
    router.post("/admin/annualreview/add", &addAnnualReview);
    // 编辑年度点评
    router.put("/admin/annualreview/:id", &editAnnualReview);
    // 删除年度点评
    router.delete_("/admin/annualreview/:id", &deleteAnnualReview);

    // 采集视频信息
    router.post("/admin/collect", &collect);
    // admin路由end--------------------------------------------------

    // 启动http服务
    auto listener = listenHTTP(settings, router);
    scope (exit)
    {
        listener.stopListening();

        import core.stdc.stdlib : exit;

        exit(0);
    }
    logInfo("It is run http://127.0.0.1:7879/ ");
    runApplication();
}

/** 
 * 路由错误处理函数
 */
void errorPage (HTTPServerRequest req, HTTPServerResponse resp, HTTPServerErrorInfo error)
{
    import utils.RespData : RespData;

    resp.writeJsonBody(RespData.newData(error.code, error.message), error.code);
}
